#!/bin/bash

alkuhetki=$(date +%s.%N) # 9951
echo '' > delme; for n in {a..z} {a..z}{a..z} {a..z}{a..z}{a..z}; do matriisi[$m]=$(parallel -j10 < echo $n' '$(echo -n $n | md5sum)); done; echo "taulukon teko kesti: "$(echo $(date +%s.%N)-$alkuhetki | bc)
while true; do
  read -p 'Anna md5sum josta haluat salasanan: ' md5sum
  [[ ! $md5sum ]] && break
  echo 'vastava salasana: '$(grep $md5sum delme | awk '{print $1}'); echo
done
exit


alkuhetki=$(date +%s.%N) # 9951
# echo '' > delme; for n in {a..z} {a..z}{a..z} {a..z}{a..z}{a..z} {a..z}{a..z}{a..z}{a..z}; do echo $n' '$(echo -n $n | md5sum) >> delme; done; echo "taulukon teko kesti: "$(echo $(date +%s.%N)-$alkuhetki | bc)
while true; do
  read -p 'Anna md5sum josta haluat salasanan: ' md5sum
  [[ ! $md5sum ]] && break
  echo 'vastava salasana: '$(grep $md5sum delme | awk '{print $1}'); echo
done
exit

# tavalliseen matriisiin. Hidas.
alkuhetki=$(date +%s.%N)
echo '' > delme;m=0; for n in {a..z} {a..z}{a..z}; do matriisi[$m]=$(echo $n' '$(echo -n $n | md5sum));let m++; done
echo "työ kesti: "$(echo $(date +%s.%N)-$alkuhetki | bc)
read 
echo -e ' '"${matriisi[@]/%/\n}" 
exit

# m=0; for n in {a..z} {a..z}{a..z} {a..z}{a..z}{a..z}; do avain[$m]=$n; lukko[$m]=$(echo $n | md5sum ); let m++; done 

# asso versio: assosiatiivisen matriisin muodostaminen levyltä luettujen perusteella kestää kauan vähänkin suuremmilla tiedostoilla.
# xargs -P 3 -n 1 <COMMAND> < <FILE_LIST>
# esimerkiksi: find . -type f -name '*.wav' -print0 |xargs -0 -P 3 -n 1 flac -V8
# echo {a..z} {a..z}{a..z}; | xargs -P 0 -n 1 avain[$(echo -n $n | md5sum | cut -c1-32 )]=$n

# apu=($( cat delme1));echo ${apu[$(grep -n eae5931160b826cd65dfd1f5918cfef5 delme2 | tr \: " " | awk '{print $1}') ]}
function talleta_md5sum_taulu () { # assosiatiivinen matriisi levylle. /tmp-kansioon talletetut häviävät bootatessa mutta eipähän kotikansio sotkeennu.
echo -e ${avain[*]} | tr " " "\n" > /tmp/delme1   # arvot tulostuvat omille riveilleen
echo -e ${!avain[*]} | tr " " "\n" > /tmp/delme2  # osoitteet tulostuvat omille riveilleen 
}

function lue_md5sum_taulu () { # assosiatiivinen matriisi levyltä
  arvot=($( cat delme1)); osoitteet=($( cat delme2)); for (( n=0; n<${#arvot[@]}; n++ )); do avain[${osoitteet[$n]}]=${arvot[$n]}; done
}

function tee_uusi_md5sum_salasana_taulukko_levylle () {
alkuhetki=$(date +%s.%N) # tämä lause kirjoitetaan skriptin ajoitettavan kohdan eteen
echo "salasanan muuntaminen md5sum:masta muodostamalla ensin matriisi 1-3 kirjaimisien pien-aakkos-salasanojen md5sum:mista. Odota, älä tee mitään"
for n in {a..z} {a..z}{a..z}; do avain[$(echo -n $n | md5sum | cut -c1-32 )]=$n; done
echo "työ kesti: "$(echo $(date +%s.%N)-$alkuhetki | bc) # tämä lause kirjoitetaan ajoitettavan kohdan perään
talleta_md5sum_taulu
}

function muunna_salasana_md5summasta () {
while true; do
  read -p 'Anna md5sum josta haluat salasanan: ' md5sum
  [[ ! $md5sum ]] && break
  echo 'vastava salasana: '${avain[$md5sum]:- ei löydy taulukosta}; echo
 done
}

# pääohjelma
unset avain; declare -A avain
read -p "oletko kommentoinut oikean lauseen (tee_uusi_md5sum_salasana_taulukko_levylle tai: lue_md5sum_taulu)"
# tee_uusi_md5sum_salasana_taulukko_levylle # joko tämä tai seuraava lause kommentoidaan
lue_md5sum_taulu; 
muunna_salasana_md5summasta
exit




# Ajaaskelen skripti:
tutki()
{
found=false
while read -r salasana &&  ! $found 
do
	generoitu=$(echo $salasana | md5sum | cut -c1-32)
	if [ "$testattava" = "$generoitu" ]; then
		echo "Salasana on: $salasana"
		found=true	
	fi 
done <<< "$lista"
! $found && echo
}

echo
echo "md5 tiivisteen avaus kokeilemalla vaihtoehdot peräkkäin."
echo "Tämä esimerkki etsii vain pieniä kirjaimia a...z."
echo "Salasanan pituus voi olla yhdestä neljään merkkiä."
echo
read -p "Anna md5: " testattava
alkuhetki=$(date +%s.%N) # tämä lause kirjoitetaan skriptin ajoitettavan kohdan eteen
echo
echo "Kokeillaan yksimerkkiset salasanat"
lista=$(echo {a..z} | tr ' ' '\n')
tutki
if ! $found; then
echo "Kokeillaan kaksimerkkiset salasanat"
lista=$(echo {a..z}{a..z} | tr ' ' '\n')
tutki
fi
if ! $found; then
echo "Kokeillaan kolmemerkkiset salasanat"
lista=$(echo {a..z}{a..z}{a..z} | tr ' ' '\n')
tutki
fi
if ! $found; then
echo "Kokeillaan nelimerkkiset salasanat"
lista=$(echo {a..z}{a..z}{a..z}{a..z} | tr ' ' '\n')
tutki
fi
echo "työ kesti: "$(echo $(date +%s.%N)-$alkuhetki | bc) # tämä lause kirjoitetaan ajoitettavan kohdan perään
echo
exit
 
for salasana in {a..z}{a..z}{a..z}; do echo $salasana; done | parallel -j 10 taulu[$(echo $salasana | md5sum )]=$salasana {}
exit






# normaaliversio
echo '' > /home/petteri/OMATSKRIPTIT/"KOE- JA ESIMERKKISKRIPTIT"/ARKISTO/POISTETUT/delme 
echo "Teen taulukkoa, älä koske."
alkuhetki=$(date +%s.%N) # tämä lause kirjoitetaan skriptin ajoitettavan kohdan eteen   
for salasana in {a..z} {a..z}{a..z} {a..z}{a..z}{a..z}; do echo $(echo $salasana | md5sum | tr -d ' -')$salasana >> /home/petteri/OMATSKRIPTIT/"KOE- JA ESIMERKKISKRIPTIT"/ARKISTO/POISTETUT/delme; done  
echo "työ kesti: "$(echo $(date +%s.%N)-$alkuhetki | bc) # tämä lause kirjoitetaan ajoitettavan kohdan perään
while true; do
  read -p 'mikä on md5sum:' md5sum 
  [[ ! $md5sum ]] && break
  salasana=$(grep $md5sum /home/petteri/OMATSKRIPTIT/"KOE- JA ESIMERKKISKRIPTIT"/ARKISTO/POISTETUT/delme);  [[ $salasana ]] && echo 'salasana='${salasana:32} || echo "talukosta ei löydy antamasi md5sum:maa vastaavaa salasanaa"
done

exit


# pieni asso
declare -A taulu
for salasana in {a..z}{a..z} ; do
  taulu[$( echo $salasana | md5sum | cut -c1-32) ]=$salasana 
done
#for i in "${!taulu[@]}"; do echo -e "osoite: $i\narvo : ${taulu[$i]}"; echo; done # koetulostus toimiiko. Jossain lajitellaan jonkin mukaan.
read -p 'annapa md5sum:' md5sum
echo 'vastaava salasana on:'${taulu[$md5sum]}
exit


# pieni asso rinnakkaisprosessoinnilla, joka ei asson kanssa toimi
echo '' > taulu; NPROC=0
for salasana in {a..z}{a..z}{a..z}; do 
(  echo -n $salasana' ' >> taulu &
   echo $salasana | md5sum >> taulu & ) # järjestys sekoilee, käyttökelvoton ?
    NPROC=$(($NPROC+1))
    if [ "$NPROC" -ge 4 ]; then
        wait
        NPROC=0
    fi
done
exit


function Tee {
  echo -n $salasana' ' >> taulu  
  echo $salasana | md5sum >> taulu 
}

echo '' > taulu
for salasana in {a..z}{a..z}{a..z}; do 
  echo $salasana | parallel -j 10 Tee {}
done
exit


declare -A taulu # assosiatiivinen matriisi ei sovellu rinnakkaisprosessointiin
for salasana in {a..z}{a..z}; do
  taulu[$( echo $salasana | md5sum)]=$salasana 
done
for i in "${!taulu[@]}"; do echo -e "osoite: $i\narvo : ${taulu[$i]}"; echo; done # koe toimiiko. Jossain lajitellaan jonkin mukaan.
read -p 'annapa md5sum:' md5sum
echo 'vastaava salasana on:'${taulu[$md5sum]}
exit


for ARG in  $*; do
    command $ARG &
    NPROC=$(($NPROC+1))
    if [ "$NPROC" -ge 4 ]; then
        wait
        NPROC=0
    fi
done

exit

ls -1 /malware/samples/* | parallel -j 10 analyze {}

# Ongelmaa on kiva pähkäillä koska BASH on niin kelvoton näissä murtohommissa etteivät mitkään ratkaisut voi johtaa mihinkään.
# Kun käytössä on valmiiksi tehty taulukko niin  tämä on silti 'riittävän nopea'. Mikäli käytettävissä on valmistaulukko kommentoidaan kaksi seuraavaa lausetta.


# Tämä ratkaisu kuvaa assosiatiivisen matriisin käsittelyä ja mielestäni se kertookin assosiatiivisen matriisin kyvyistä varsin hyvin: koko BASH on hidas kuin mikä ja assosiatiivisen matriisin toteutus on kaikilla kielillä  kielen muihin toimiin verrattuna hidas - siis oikeastaan BASH:in assosiatiivinen matriisi kiitää. 

# Tämä toteutus pystyy käyttämään jo tehtyä taulukkoa ja nopeus valmiilla levyllä olevalla taulukolla onkin parikymmen-kertainen ja RAM:missa olevan taulun kanssa tuhatkertainen. Mikäli käytettävissä on valmis taulukko niin lause: tee_uusi_md5sum_salasana_taulukko_levylle kommentoidaan. 
